const mysql = require("mysql");
const config = require("../../common/config");
const util = require("../../common/util");

// 创建数据库连接池
// const pool = mysql.createPool(config.dbConfig);
const pool = require("../../common/util");

// 创建表的 SQL 语句
const sqlCreateUser = `
CREATE TABLE IF NOT EXISTS users (  
  id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT '用户ID，主键，自增',  
  username VARCHAR(255) NOT NULL COMMENT '用户名',  
  password VARCHAR(255) NOT NULL COMMENT '密码（请确保在生产环境中安全存储和加密）',  
  nickname VARCHAR(255) DEFAULT NULL COMMENT '昵称',   
  truename VARCHAR(255) NOT NULL COMMENT '真实姓名',  
  avatar VARCHAR(255) DEFAULT NULL COMMENT '头像链接或存储位置',   
  role INTEGER NOT NULL COMMENT '用户角色（例如：管理员、普通用户等）',  
  last_login_time DATETIME DEFAULT NULL COMMENT '上次登录时间',   
  last_login_ip VARCHAR(255) NOT NULL  COMMENT '上次登录IP地址',  
  login_count INTEGER DEFAULT 0 COMMENT '登录次数',   
  created_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '账户创建时间（默认值为当前时间戳）',  
  created_ip VARCHAR(255) NOT NULL COMMENT '账户创建时的IP地址',   
  updated_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间（每次更新记录时自动更新为当前时间戳）',  
  email VARCHAR(255) DEFAULT NULL COMMENT '邮箱地址',  
  phone_number VARCHAR(20) NOT NULL UNIQUE COMMENT '电话号码（唯一）',  
  is_verified BOOLEAN NOT NULL DEFAULT false COMMENT '是否已验证（默认未验证）',   
  last_password_change_time DATETIME DEFAULT NULL COMMENT '上次密码更改时间',  
  account_status ENUM('active', 'suspended', 'deleted') NOT NULL DEFAULT 'active' COMMENT '账户状态（活动、暂停、已删除）'  
)COMMENT='用户表';
`;

//SQL语句：创建User数据表中的第一个用户
const sqlCreateAdminUser = `
    INSERT IGNORE INTO users(  
        username, password, nickname, truename, avatar,  
        role, last_login_time, last_login_ip, login_count,created_ip, email, phone_number
    ) VALUES (  
        'admin', '${util.md5pwd("123456")}', '系统管理员', '超级管理员', './images/default.png',  
        1, NOW(), 'never login', 0, '122222','admin@example.com', '123456789' 
    );  
    `;
//创建地址表，用户表的ID作为外键
const sqlCreateAddress = `
    CREATE TABLE IF NOT EXISTS addresses (  
        id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,  
        user_id INTEGER NOT NULL,  
        name VARCHAR(255) NOT NULL,  
        address_line1 VARCHAR(255) NOT NULL,  
        address_line2 VARCHAR(255),  
        city VARCHAR(255) NOT NULL,  
        state_province VARCHAR(255),  
        postal_code VARCHAR(20) NOT NULL,  
        country VARCHAR(255) NOT NULL,  
        is_default BOOLEAN NOT NULL DEFAULT false,  
        created_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,  
        phone_number VARCHAR(20) NOT NULL,
        updated_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
    )COMMENT='地址表';
`;

//创建仓库表warehouse
const sqlCreateWarehouse = `
CREATE TABLE IF NOT EXISTS warehouse (  
  id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT '仓库的唯一标识符',  
  name VARCHAR(255) NOT NULL COMMENT '仓库的名称',  
  location VARCHAR(255) NOT NULL COMMENT '仓库的地理位置',  
  size DECIMAL(10, 2) NOT NULL COMMENT '仓库的占地面积（平方米）',  
  total_capacity DECIMAL(10, 2) NOT NULL COMMENT '仓库的总容量（立方米）',  
  manager VARCHAR(255) COMMENT '仓库的经理姓名',  
  active BOOLEAN DEFAULT TRUE COMMENT '仓库是否处于活跃状态（默认为TRUE）',  
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '仓库的创建时间（默认为当前时间戳）',  
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '仓库的最后更新时间（默认为当前时间戳，并在每次更新时自动更新）'  
) COMMENT='仓库表';`;

//货架表的创建
const sqlCreateShelves = `
CREATE TABLE IF NOT EXISTS shelves (  
  id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT '货架的唯一标识符',  
  warehouseZone_id INT(10) NOT NULL COMMENT '所属的区域标识符，引用WarehouseZone表的WarehouseZone_id',  
  shelf_number VARCHAR(255) UNIQUE NOT NULL COMMENT '货架的具体编号或名称',  
  shelf_type VARCHAR(255) COMMENT '货架类型（如普通货架、重型货架等）',  
  shelf_size VARCHAR(255) COMMENT '货架尺寸（如"L100xW50xH200"）',  
  shelf_capacity DECIMAL(10,2) COMMENT '货架容量（最大承载重量或物品数量）', 
  layers INT(10) NOT NULL COMMENT '货架的层数', 
  shelf_status ENUM('idle', 'in_use', 'under_maintenance') COMMENT '货架状态',  
  shelf_location VARCHAR(255) COMMENT '货架位置',  
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  
  description TEXT COMMENT '关于货架的额外描述或备注信息',   
  photo_url VARCHAR(255) COMMENT '货架图片链接'
) COMMENT='货架表';
  `;

//货架层表，关联货架表
const sqlCreateshelfItems = `
CREATE TABLE IF NOT EXISTS shelf_items (    
  id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT '货架物品的唯一标识符',    
  shelf_id INT(10) NOT NULL COMMENT '货架的唯一标识符，引用shelves表的id',    
  layer_number INT(10) NOT NULL COMMENT '货架的层号',    
  item_id INT(10) NOT NULL COMMENT '物品的唯一标识符，引用其他物品表的id',
  delivery_id INT NOT NULL COMMENT '快递员的编号',   
  retrieve_code VARCHAR(255) NOT NULL COMMENT '取件码', 
  status ENUM('在库存', '已取出', '无人领取') NOT NULL DEFAULT '在库存' COMMENT '物品的状态（在库存、已取出、无人领取）',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间'
) COMMENT='货架物品表';
`;

//物品表的创建，与存储表，用户表相关联
const sqlCreateItem = `
CREATE TABLE IF NOT EXISTS Items (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '物品的唯一标识符',
  owner_id INT NOT NULL COMMENT '物品所有者的唯一标识符，引用Users表的id字段',
  name VARCHAR(255) NOT NULL COMMENT '物品的名称',
  description TEXT DEFAULT NULL COMMENT '物品的描述信息',
  category VARCHAR(100) NOT NULL COMMENT '物品的类别',
  orderId VARCHAR(20) NOT NULL COMMENT '物品的订单号',
  quantity INT NOT NULL DEFAULT 1 COMMENT '物品的数量，默认为1',
  barcode VARCHAR(255) DEFAULT NULL COMMENT '物品的条形码',
  image_path VARCHAR(255) DEFAULT NULL COMMENT '物品图片的路径',
  retrieve_time DATETIME NOT NULL COMMENT '物品被取出的时间',   
  created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '物品的创建时间（默认为当前时间戳）',
  last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '物品信息最后修改的时间，默认为当前时间戳，并在每次更新时自动更新'
)COMMENT='物品表';`;

//创建仓库分区表  
const sqlCreateWarehouseZone = `
  CREATE TABLE IF NOT EXISTS WarehouseZone (  
    id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT '仓库区域的唯一标识符',  
    warehouse_id INT NOT NULL COMMENT '关联的仓库ID',  
    name VARCHAR(255) NOT NULL COMMENT '区域名称',  
    capacity DECIMAL(10, 2) NOT NULL COMMENT '区域容量（单位：立方米）',  
    occupied_space DECIMAL(10, 2) DEFAULT 0 COMMENT '已占用空间（单位：立方米）',  
    zone_type ENUM('存储区', '拣货区', '缓冲区', '其他','长时间无人认领区') NOT NULL COMMENT '区域类型',  
    zone_manager_id INT COMMENT '区域管理员ID（引用用户表的id字段）',  
    location_guide TEXT COMMENT '位置指南或地图',  
    safety_stock_level DECIMAL(10, 2) COMMENT '安全库存水平（单位：件）',  
    last_audit_date DATE COMMENT '最后审计日期',  
    comments TEXT COMMENT '备注或额外信息'  
  ) COMMENT='仓库区域信息表';
`;

//创建预约表
const sqlCreateReservation = `
  CREATE TABLE IF NOT EXISTS reservations (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '预约的唯一标识符',
    item_id INT NOT NULL COMMENT '物品ID，关联Items表',
    reserver_id INT NOT NULL COMMENT '预约人ID，关联Users表',
    reservation_time DATETIME NOT NULL COMMENT '预约时间',
    confirmed BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否已确认',
    status ENUM('pending', 'confirmed', 'cancelled') NOT NULL COMMENT '预约状态',
    note TEXT COMMENT '预约说明',
    delivery_person_id INT COMMENT '配送人员ID'
  ) COMMENT='预约表，记录物品的预约信息';
`
//SQL语句：创建留言数据表
const sqlCreateReview = `
  CREATE TABLE IF NOT EXISTS reviews (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '留言唯一标识符',
    user_id INT COMMENT '留言用户的ID',
    content TEXT NOT NULL COMMENT '留言内容',
    message_time DATETIME NOT NULL COMMENT '留言时间',
    reply_content TEXT COMMENT '回复内容',
    reply_time DATETIME DEFAULT NULL COMMENT '回复时间',
    status INTEGER DEFAULT 0 COMMENT '留言状态，例如：0-未读，1-已读，2-已回复'
  ) COMMENT='留言表';
`;


class MysqlDB {
  constructor() {
    this.pool = pool;
    this.createTables();
  }

  async createTables() {
    try {
      // 开始事务（如果需要的话）
      await this.pool.query('START TRANSACTION');

      // 执行创建表的 SQL 语句
      await this.pool.query(sqlCreateUser);
      await this.pool.query(sqlCreateAddress);
      await this.pool.query(sqlCreateWarehouse);
      await this.pool.query(sqlCreateWarehouseZone);
      await this.pool.query(sqlCreateShelves);
      await this.pool.query(sqlCreateshelfItems);
      await this.pool.query(sqlCreateItem);
      await this.pool.query(sqlCreateAdminUser);
      await this.pool.query(sqlCreateReservation);
      await this.pool.query(sqlCreateReview);
      // 提交事务（如果需要的话）
      await this.pool.query('COMMIT');
    } catch (err) {
      // 发生错误时回滚事务（如果需要的话）
      await this.pool.query('ROLLBACK');
      console.error('Failed to create table users:', err);
    }
  }

  // 关闭数据库连接池（一般在应用退出时调用）
  // closePool() {
  //   if (pool) {
  //     pool.end();
  //   }
  // }
}

// 导出 MysqlDB 类
module.exports = MysqlDB;
